const Koa = require('koa')
const Router = require('koa-router')
const mongoose = require('mongoose')
const passport = require('koa-passport')
const koaBody = require('koa-body')
const serve = require('koa-static')
const path = require('path')
const { accessLogger, logger } = require('./lib/logger')
const render = require('koa-art-template')
const session = require('koa-session')
const cors = require('koa2-cors')

// 实例化
const app = new Koa()
const router = new Router()

// 引入配置文件
const ConfigManager = require('./lib/config.js')
// 引入user.js
const user = require('./routes/api/user.js')
// 引入file.js
const file = require('./routes/api/file.js')
// 引入admin.js
const admins = require('./routes/admin.js')
// print.js
const print = require('./routes/api/print.js')

// // 连接数据库
// mongoose.connect(
//   'mongodb://cailiquan:cai5360523@cluster0-shard-00-00.xpfnv.mongodb.net:27017,cluster0-shard-00-01.xpfnv.mongodb.net:27017,cluster0-shard-00-02.xpfnv.mongodb.net:27017/test?ssl=true&replicaSet=atlas-rpfrnn-shard-0&authSource=admin&retryWrites=true&w=majority', {
//     useUnifiedTopology: true,
//     useNewUrlParser: true
//   }
// )
//   .then(() => {
//     console.log('数据库连接')
//   })
//   .catch((err) => {
//     console.log(err)
//   })

// 访问级别日志
app.use(accessLogger())

// 应用级别系统日志--记录系统状态error
app.on('error', (err) => {
  logger.error(err)
})

app.use(cors())
// 处理跨域
app.use(async (ctx, next) => {
  ctx.set('Access-Control-Allow-Origin', '*')
  ctx.set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, DELETE')
  ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, token')
  await next()
})

// 引入passport验证token
app.use(passport.initialize())
app.use(passport.session())

// 回调到servse/passport
require('./servse/passport')(passport)

// 配置routers目录下的路由地址 localhost:3000/api/user/
router.use('/api/user', user)

// 配置routers目录下的路由地址 localhost:3000/api/fileuploads/
router.use('/api/file', file)

// 配置routers目录下的路由地址 localhost:3000/api/print/
router.use('/api/print', print)

// 配置routers目录下的路由地址 localhost:3000/admin/admin/
router.use('/admin', admins)

// 配置视图模板
render(app, {
  root: path.join(__dirname, 'view'),
  extname: '.html',
  debug: process.env.NODE_ENV !== 'production'
})

// 配置后台管理系统的session
const CONFIG = {
  key: 'koa.sess',
  maxAge: 86400000,
  autoCommit: true,
  overwrite: true,
  httpOnly: true,
  signed: true,
  rolling: true, // 每次访问都重新设置session有效时间
  renew: false,
  secure: false,
  sameSite: null
}
// 使用session
app.keys = ['some secret hurr']
app.use(session(CONFIG, app))

// 挂载静态资源
app.use(serve('./static'))

app.use(koaBody({
  multipart: true, // 是否支持 multipart-formdate 的表单
  formidable: {
    // uploadsDir: path.join(__dirname, 'public/uploads/'),
    maxFileSize: 2000 * 1024 * 1024, // 设置上传文件大小最大限制，默认2M
    keepExtensions: true // 保留文件拓展名
  }
}))

// 生成静态服务，使得public下的文件都可用http访问
app.use(serve(path.join(__dirname, 'public')))

// 启动路由
app.use(router.routes()).use(router.allowedMethods())

// 配置端口号
const port = ConfigManager.getPort()

// 监听端口
app.listen(port, () => {
  console.log('server start on ', port)
})
